CREATE OR REPLACE FUNCTION get_store_with_highest_revenue_growth()
RETURNS TABLE (
    store_id INT,
    store_name TEXT,
    previous_year_revenue NUMERIC,
    last_year_revenue NUMERIC,
    revenue_growth NUMERIC
)
LANGUAGE plpgsql
AS $$
BEGIN
    RETURN QUERY
    WITH yearly_revenue AS (
        SELECT
            s.store_id,
            s.name AS store_name,
            EXTRACT(YEAR FROM o.last_modified_date)::INT AS year,
            SUM(
                p.price
                * o.quantity
                * (1 - COALESCE(o.discount, 0) / 100.0)
            ) AS total_revenue
        FROM store s
        JOIN sells se
            ON s.store_id = se.store_id
        JOIN product p
            ON se.code = p.code
        JOIN includes i
            ON p.code = i.code
        JOIN "order" o
            ON i.order_num = o.order_num
        WHERE o.last_modified_date >=
              date_trunc('year', CURRENT_DATE) - INTERVAL '2 years'
          AND o.last_modified_date <
              date_trunc('year', CURRENT_DATE)
        GROUP BY
            s.store_id,
            s.name,
            EXTRACT(YEAR FROM o.last_modified_date)
    ),
    revenue_comparison AS (
        SELECT
            store_id,
            store_name,
            MAX(
                CASE
                    WHEN year = EXTRACT(YEAR FROM CURRENT_DATE)::INT - 2
                    THEN total_revenue
                    ELSE 0
                END
            ) AS previous_year_revenue,
            MAX(
                CASE
                    WHEN year = EXTRACT(YEAR FROM CURRENT_DATE)::INT - 1
                    THEN total_revenue
                    ELSE 0
                END
            ) AS last_year_revenue
        FROM yearly_revenue
        GROUP BY
            store_id,
            store_name
    )
    SELECT
        store_id,
        store_name,
        previous_year_revenue,
        last_year_revenue,
        last_year_revenue - previous_year_revenue AS revenue_growth
    FROM revenue_comparison
    ORDER BY revenue_growth DESC
    LIMIT 1;
END;
$$;